package com.example.rssreader.config;

import com.example.rssreader.service.RssFeedService;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

/**
 * 定时任务配置类
 * 配置RSS源同步等定时任务
 * 
 * @author RSS Reader Team
 * @version 1.0.0
 * @since 2024-01-01
 */
@Slf4j
@Component
@Configuration
@RequiredArgsConstructor
public class ScheduleConfig {

    private final RssFeedService rssFeedService;

    /**
     * RSS同步间隔时间（分钟）
     */
    @Value("${rss.sync.interval:30}")
    private Integer syncInterval;

    /**
     * 定时同步所有RSS源
     * 默认每30分钟执行一次
     * 可通过配置文件中的 rss.sync.interval 参数调整间隔时间
     */
    @Scheduled(fixedDelayString = "#{${rss.sync.interval:30} * 60 * 1000}")
    public void syncAllRssFeeds() {
        log.info("开始执行定时同步RSS源任务");
        
        try {
            String result = rssFeedService.syncAllFeeds();
            log.info("定时同步RSS源任务完成: {}", result);
            
        } catch (Exception e) {
            log.error("定时同步RSS源任务执行失败: {}", e.getMessage(), e);
        }
    }

    /**
     * 清理旧文章任务
     * 每天凌晨2点执行，清理30天前的文章
     */
    @Scheduled(cron = "0 0 2 * * ?")
    public void cleanOldArticles() {
        log.info("开始执行清理旧文章任务");
        
        try {
            // 清理30天前的文章
            int daysAgo = 30;
            
            // 这里需要注入ArticleService，但为了简化，我们先记录日志
            log.info("清理旧文章任务：计划清理{}天前的文章", daysAgo);
            
            // TODO: 实现清理逻辑
            // Integer deletedCount = articleService.cleanOldArticles(daysAgo);
            // log.info("清理旧文章任务完成，删除数量: {}", deletedCount);
            
        } catch (Exception e) {
            log.error("清理旧文章任务执行失败: {}", e.getMessage(), e);
        }
    }

    /**
     * 系统健康检查任务
     * 每小时执行一次，检查系统状态
     */
    @Scheduled(fixedRate = 3600000) // 每小时执行一次
    public void healthCheck() {
        log.debug("执行系统健康检查");
        
        try {
            // 获取RSS源统计信息
            Object statistics = rssFeedService.getFeedStatistics();
            log.debug("系统健康检查完成，RSS源统计: {}", statistics);
            
        } catch (Exception e) {
            log.warn("系统健康检查失败: {}", e.getMessage());
        }
    }

    /**
     * 数据库连接检查任务
     * 每10分钟执行一次，确保数据库连接正常
     */
    @Scheduled(fixedRate = 600000) // 每10分钟执行一次
    public void databaseConnectionCheck() {
        log.debug("执行数据库连接检查");
        
        try {
            // 通过查询RSS源数量来检查数据库连接
            Object statistics = rssFeedService.getFeedStatistics();
            log.debug("数据库连接检查正常");
            
        } catch (Exception e) {
            log.error("数据库连接检查失败: {}", e.getMessage(), e);
        }
    }
}